﻿#ifndef PLUGINSPEC_P_H
#define PLUGINSPEC_P_H
#include <QObject>
#include <QPluginLoader>
#include <QDir>
#include <QJsonArray>
#include "Extensionsystem_Global.h"
#include "PluginSpec.h"
#include "IPlugin.h"

namespace CVV
{

namespace Infrastructure
{

namespace ExtensionSystem
{


namespace Internal
{

class EXTENSIONSYSTEM_EXPORT  PluginSpecPrivate : public QObject
{
    Q_OBJECT
public:
    PluginSpecPrivate(PluginSpec  *spec);
    ~PluginSpecPrivate() override;
    /**
     * @brief read
     * 1.读取插件信息
     * @param fileName
     * 文件名称
     * @return
     */
    bool read(const QString &fileName);
    /**
     * @brief loadLibrary
     * 2.加载动态库
     * @return
     */
    bool loadLibrary();

    /**
      * @brief initializePlugin
      * 3.初始化插件
      * @return
      */
     bool initializePlugin();
     /**
      * @brief kill
      * 删除当前插件
      */
     void kill();
private:
     /**
       * @brief readMetaData
       * 从Json对象获取信息
       * @param pluginMetaData
       * @return
       */
      bool readMetaData(const QJsonObject &pluginMetaData);
      /**
       * @brief reportError
       * @param err
       * 存在错误信息标记
       * @return
       */
      bool reportError(const QString &err);
      /**
       * @brief isValidVersion
       * 判断是否合理的版本号
       * @param version
       * 版本信息
       * @return
       * 有效的版本返回true 否则返回false
       */
      static bool isValidVersion(const QString &version);
public:
    PluginSpec *m_pluginSpec;
    IPlugin *m_plugin = nullptr;
    PluginSpec::State m_state = PluginSpec::Invalid;
    bool m_hasError = false;
    QJsonObject m_metaData;
    /**
     * @brief errorString
     * 异常描述
     */
    QString m_errorString;
    /**
     * @brief filePath
     * 插件路径
     */
    QString m_filePath;
    /**
     * @brief arguments
     * 初始化插件参数
     */
    QStringList m_arguments;
    /**
     * @brief loader
     * 插件加载器
     */
    QPluginLoader m_loader;

    /**
      属性开始
     **/
    /**
     * @brief m_name
     * 插件名称
     */
    QString m_name;
    /**
     * @brief m_version
     * 插件版本
     */
    QString m_version;
    /**
     * @brief m_compatVersion
     * 兼容版本
     */
    QString m_compatVersion;
    /**
     * @brief m_description
     * 插件描述
     */
    QString m_description;
    /**
     * @brief m_vendor
     * 插件出售方
     */
    QString m_vendor;
    /**
     * @brief m_copyright
     * 版权
     */
    QString m_copyright;
    /**
     * @brief m_license
     * 许可证
     */
     QString m_license;
    /**
     * @brief m_url
     * 插件验证url地址
     */
    QString m_url;

    /**
     * @brief m_category
     * 分类
     */
    QString m_category;

    /**
     * @brief m_categoryIcon 分类Icon
     */
    QString m_categoryIcon;

    /**
     * @brief m_revision
     * 修订版本
     */
    QString m_revision;
    /**
     * @brief m_array
     * 修改参数
     */
    QJsonArray m_params;

    /**
     * @brief m_array
     * 输入参数
     */
    QJsonArray m_inputParams;

    /**
     * @brief m_array
     * 输出参数
     */
    QJsonArray m_outParams;

    /**
     * @brief m_array
     * 输出参数
     */
    QJsonArray m_tempParams;
    /**
     * @brief m_code
     * 插件code
     */
    QString m_code;
    /**
     * @brief m_iconPath
     */
    QString m_iconPath;


};
} // namespace Internal

}

}

} // namespace ExtensionSystem
#endif // PLUGINSPEC_P_H
